// 两个 NaN, 或者NaN跟其他任何值都不相等
console.log(NaN === NaN) // false
console.log(+Infinity === -Infinity) // false
console.log(+Infinity === +Infinity) // true


// +0 和 -0 相等
console.log(+0 === -0)  // true

// 非严格相等：（抽象/非约束）相等 ==，专业名词叫 Loose(自由的，不受限制的) Equality,也叫 Abstract equality
// 两边都有可能发生隐式类型转换，转换以后还是用严格相等来进行比较

// Object.is() 用来判断同值相等,不进行隐式类型转换
// NaN === NaN => 同值相等
// -0 !== +0 => 同值相等
Object.is(NaN, NaN)  // true
Object.is(+0, +0) // true
Object.is(+0, -0) // false

// 手写实现 Object.is()
Object.myIs = function (a, b) {
  if (a === b) {
    return a !== 0 || 1 / a === 1 / b  // 1 / +0 = Infinity        1 / -0 = -Infinity
  }
  return a !== a && b!== b
}

// 手写实现 isNaN
function myIsNaN(num) {
  let ret = Number(num)
  ret += ''
  if (ret === 'NaN') {
    return true
  } else {
    return false
  }
}
